package ants;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.HashMap;

public class Logic {
    HashMap<Integer, Integer> trans;
    Logic(){}
    MoveList Logics(Mapa m, ArrayList hor, AntsView view){
        trans = new HashMap<Integer, Integer>();
        trans.put(0,0);
        trans.put(1,3);
        trans.put(2,6);
        trans.put(3,1);
        trans.put(4,4);
        trans.put(5,7);
        trans.put(6,2);
        trans.put(7,5);
        trans.put(8,8);
        MoveList movs = new MoveList();
        ListIterator itr = hor.listIterator();
        int[] pesos = new int[9];
        double[] porc = new double[9];
        int i,j, x, y, comida, b, n, tot, ph, movsel;
        int enemigaas = 0;
        int[] fero = new int[Constantes.npheromone];
        boolean[] soltar = new boolean[Constantes.npheromone];
        System.out.println("NUEVO TURNO!");
           while (itr.hasNext()) {
                 int know[][] = new int[9][4];
                 AntsBehave hormiga = (AntsBehave) itr.next();
                 Perspective p = (Perspective)view.perspectiva.get(hormiga.id);
                 //agarramos lo que sabemos del piso
                 //Se inicializa la posicion, cuanta comida hay alrededor, cauntas feromonas hay alrededor y si debe o no soltar feromona.
                 x = hormiga.place.x;
                 y = hormiga.place.y;
                 
                 //System.out.println("Hormiga con id: " + hormiga.id + "x: " + hormiga.place.x + " y: " + hormiga.place.y);
                 //tomamos el conocimiento del piso
                 hormiga.getfloorknowledge( m.cells[hormiga.place.y][hormiga.place.x].know);
                 comida = 0;
                 for(i=0;i<Constantes.npheromone;i++){
                     fero[i]=0;
                     soltar[i] = false;
                 }
                 
                 //MARCAR EL CAMINO DESPUES DE MOVERSE
                 if(m.cells[y][x].getDist()==-1){
                    m.cells[y][x].setDir(hormiga.getDir());
                    m.cells[y][x].setDist(hormiga.getDist());
                 }else if(m.cells[y][x].getDist()>hormiga.getDist()){
                    m.cells[y][x].setDir(hormiga.getDir());
                    m.cells[y][x].setDist(hormiga.getDist()); 
                 }
                 //peso base, peso comida, peso fer e, peso fer c, fer p, hor
                 //CHECAR ALREDEDOR DE LA HORMIGA POR FEROMONAS Y COMIDA
                 for(j=-1;j<=1;j++){
                     for(i=-1;i<=1;i++){
                         comida+=m.cells[i+y][j+x].comida;
                         fero[0]+=m.cells[i+y][j+x].getPheromone(0);
                         fero[1]+=m.cells[i+y][j+x].getPheromone(1);
                     }
                 }
                 //CAMBIAR COMPORTAMIENTO
                 b=hormiga.getBehave();
                 if(hormiga.type==Constantes.explorer_id){ 
                     switch(b){
                         case Constantes.e_e:
                             soltar[0] = true;
                        //Hay comida alrededor
                        if(comida>0){
                            soltar[1] = true;
                        }
                        //Hay comida en la casilla en la que estas
                        if(m.cells[y][x].comida>0){
                            soltar[1] = true;
                            hormiga.setBehave(Constantes.e_mcc);
                        }
                        break;
                        case Constantes.e_mcc:
                            if(m.cells[y][x].getDist()==0){
                                hormiga.setBehave(Constantes.e_e);
                            }else{
                                soltar[1] = true;
                            }
                        break;
                     }
                 }else if(hormiga.type==Constantes.worker_id){
                     switch(b){
                         case Constantes.w_e:
                             soltar[0] = true;
                           if(comida>0||fero[1]>0){
                                soltar[1] = true;
                                hormiga.setBehave(Constantes.w_ipc);
                           }
                         break;
                         case Constantes.w_ipc:
                          if(m.cells[y][x].comida>0){
                            //soltar[1] = true;
                            hormiga.setBehave(Constantes.w_raccc);
                          }else if(fero[1]==0){
                             hormiga.setBehave(Constantes.w_e);
                          }
                         break;
                         case Constantes.w_raccc:
                            if(m.cells[y][x].getDist()==0){
                                hormiga.setBehave(Constantes.e_e);
                            }else{
                                 soltar[1] = true;
                            }                             
                         break;
                     }    
                 }else if(hormiga.type==Constantes.warrior_id){
                     switch(b){
                         case Constantes.g_e:
                             soltar[0] = true;
                         if(comida>0||fero[0]>0){
                             if(comida>0)
                                soltar[1] = true;
                                hormiga.setBehave(Constantes.g_ic);
                         }
                         case Constantes.g_ic:
                          if(m.cells[y][x].comida>0){
                            soltar[1] = true; 
                          }  
                          if(fero[0]==0){
                             hormiga.setBehave(Constantes.g_e);
                          }
                     }
                 }
                 //CALCULAR PROBABILIDADES
                 if(hormiga.regresar){
                     movsel = m.cells[y][x].getDir();
                 }else{
                 //Inicializamos los pesos
                 for(i=0;i<9;i++){
                     pesos[i] = 0;
                 }
                 
                 n = 0;
                 //Calculamos los pesos de cada espacio
                 //System.out.println("Obstaculos:");
                 for(j=-1;j<=1;j++){
                     for(i=-1;i<=1;i++){
                         if(m.cells[y+i][x+j].tipo!=Constantes.obstaculo){
                            if(hormiga.type==Constantes.explorer_id){
                                pesos[n] = 
                                Constantes.e_behaves[hormiga.getBehave()][Constantes.b_peso_base]+
                                Constantes.e_behaves[hormiga.getBehave()][Constantes.b_peso_comida]*m.cells[y+i][x+j].comida+
                                Constantes.e_behaves[hormiga.getBehave()][Constantes.b_peso_fer_p]*m.cells[y+i][x+j].getPheromone(2)+
                                Constantes.e_behaves[hormiga.getBehave()][Constantes.b_peso_fer_c]*m.cells[y+i][x+j].getPheromone(1)+
                                Constantes.e_behaves[hormiga.getBehave()][Constantes.b_peso_fer_e]*m.cells[y+i][x+j].getPheromone(0);
                            }else if(hormiga.type==Constantes.worker_id){
                                pesos[n] = 
                                  Constantes.w_behaves[hormiga.getBehave()][Constantes.b_peso_base]+
                                  Constantes.w_behaves[hormiga.getBehave()][Constantes.b_peso_comida]*m.cells[y+i][x+j].comida+
                                  Constantes.w_behaves[hormiga.getBehave()][Constantes.b_peso_fer_p]*m.cells[y+i][x+j].getPheromone(2)+
                                  Constantes.w_behaves[hormiga.getBehave()][Constantes.b_peso_fer_c]*m.cells[y+i][x+j].getPheromone(1)+
                                  Constantes.w_behaves[hormiga.getBehave()][Constantes.b_peso_fer_e]*m.cells[y+i][x+j].getPheromone(0);
                             }else if(hormiga.type==Constantes.warrior_id){
                                pesos[n] = 
                                  Constantes.g_behaves[hormiga.getBehave()][Constantes.b_peso_base]+
                                  Constantes.g_behaves[hormiga.getBehave()][Constantes.b_peso_comida]*m.cells[y+i][x+j].comida+
                                  Constantes.g_behaves[hormiga.getBehave()][Constantes.b_peso_fer_p]*m.cells[y+i][x+j].getPheromone(2)+
                                  Constantes.g_behaves[hormiga.getBehave()][Constantes.b_peso_fer_c]*m.cells[y+i][x+j].getPheromone(1)+
                                  Constantes.g_behaves[hormiga.getBehave()][Constantes.b_peso_fer_e]*m.cells[y+i][x+j].getPheromone(0);
                             }//fin hormiga type
                            if(pesos[n]<0){
                                pesos[n] = 0;
                            }
                         }// es un obstatulo
                        // else{
                          //   System.out.println(n);
                         //}
                         n++;
                     }//fin i
                     
                 }//Fin j
                 //Total es la suma de todos los pesos (Para sacar un porcentaje
                 tot = 0;
                 pesos[hormiga.getDir()] = 0;
                 for(i=0;i<9;i++){
                     tot+=pesos[i];
                 }
                 //Calcular porcentajes
                 if(tot != 0){
                    porc[0] = (double)(pesos[0])/((double)tot);
                    for(i=1;i<9;i++){
                      porc[i] = ((double)(pesos[i])/((double)tot))+porc[i-1];
                    }
            //CALCULAR MOVIMIENTO
            Math.random();
            //smov es un numero del 0 al 1     
            double smov = Math.random();
            //MOvimiento standard 4
            movsel = 4;
            //Si smov cae dentro de alguno de los rangos de porc, entonces se mueve a ese lugar
            if(smov<=porc[0]&&porc[0]!=0){
                movsel = 0;
            }
            
            for(i=1;i<9;i++){
                if(porc[i]==porc[i-1]){
                    //nadaaaaa!!!!
                }else{
                     if(smov > porc[i-1] && smov <= porc[i]){
                        movsel = i;
                        break;
                     }
                }
            }
            /*
             * 
            
            System.out.println("hormiga: " + hormiga.id);
            System.out.println("Porcentajes");
            for(double ele : porc){
                System.out.print(" " + ele);
            }
            System.out.println();
            System.out.println("Smov:");
            System.out.println(smov);
            System.out.println("movsel:");
            System.out.println(movsel);*/
            }else{
                movsel = 4;
            }
            }
            //Si no es movil, no se mueve
            if(!p.movil){
               movsel = 4;
            }
            if(p.movil){
                if(hormiga.type==Constantes.explorer_id){
                    System.out.print("[Exploradora");
                 }else if(hormiga.type==Constantes.worker_id){
                    System.out.print("[Guerrera"); 
                 }else{
                     System.out.print("[Obrera");
                 }
            System.out.println("] X["+x+"] Y["+y+"] Behave["+hormiga.getBehave()+"]");
            }
            //antes de irnos escribimos lo que sabemos
            m.cells[y][x].writeknowledge(hormiga.pk);
            movs.agregar(new Move(hormiga.id, trans.get(movsel)));
            hormiga.move(movsel);
            //Guardar direccion para marcar despues
            hormiga.setDir(movsel);
            if(enemigaas>0){
                soltar[2] = true;
            }
            //Guardar la distancia recorida
            
            
            if(movsel!=4){
                hormiga.setDist(m.cells[y][x].getDist()+1);
            }else{
                hormiga.setDist(m.cells[y][x].getDist());
            }
            //DEJAR FEROMONA
            if(p.movil){
                for(j=-1;j<=1;j++){
                     for(i=-1;i<=1;i++){
                         if(m.cells[y+i][x+j].tipo!=Constantes.obstaculo){
                             for(ph=0;ph<Constantes.npheromone;ph++){
                               if(soltar[ph]){
                                   if(ph!=0){//No exploracion 
                                        if(i==0&&j==0){
                                            //Poner mucha donde esta
                                            m.cells[y+i][x+j].addPheromone(ph, Constantes.feroprin);
                                        }else{
                                            //poner poca alrededor
                                             m.cells[y+i][x+j].addPheromone(ph, Constantes.ferosec);
                                       }
                                   }else{//Exploracion 
                                       if(i==0&&j==0){
                                            m.cells[y+i][x+j].setPheromone(ph, 1);
                                       }//Poner en el lugar grande
                                   }
                               }//Soltar?
                             }
                         }
                     }
                }
            }
            
           }//Fin de la iteracion 
        return movs;
    }
}
